home *** CD-ROM | disk | FTP | other *** search
- *------------------------------------------------------------------------------
- * Tiny format unpacker, call from C:
- * untiny(ctl_adr,dat_adr,scr_adr,ctl_len);
- * Register usage:
- * d0 work register
- * d1 work register
- * d2 - not used -
- * d3 control buffer offset
- * d4 - not used -
- * d5 screen offset
- * d6 count for repeat/copy
- * d7 length of control buffer <constant>
- * a3 control buffer address <constant>
- * a4 data buffer address
- * a5 screen buffer address <constant>
- *------------------------------------------------------------------------------
- .globl _untiny
-
- _untiny link a6,#0
- movem.l d2-d6/a3-a5,-(sp)
- move.l 8(a6),a3 * Control buffer address
- move.l 12(a6),a4 * Packed data buffer address
- move.l 16(a6),a5 * Screen buffer address
- move 20(a6),d7 * # control bytes
- clr.l d3 * Control buffer offset
- clr.l d5 * Screen buffer offset
-
- t_loop jsr get_cnt * Get next count value -> d6
- tst d6
- bpl rpt_dat * (Repeat string)
- neg d6
-
- cpy_dat subq #1,d6 * Copy string of unique words...
- moveq #8,d1
- c_loop move.b (a4)+,d0
- lsl d1,d0
- move.b (a4)+,d0
- move d0,0(a5,d5.w)
- jsr get_adr * Update d5 (scrn offset)
- dbra d6,c_loop
- cmp d7,d3 * Check if any control bytes left
- blt t_loop
- bra unt_xit
-
- rpt_dat subq #1,d6 * Repeat string of words...
- move.b (a4)+,d0
- moveq #8,d1
- lsl d1,d0
- move.b (a4)+,d0
- r_loop move d0,0(a5,d5.w)
- jsr get_adr * Update d5 (scrn offset)
- dbra d6,r_loop
- cmp d7,d3 * Check if any control bytes left
- blt t_loop
-
- unt_xit tst.l (sp)+
- movem.l (sp)+,d3-d6/a3-a5 * Restore registers
- unlk a6
- rts
-
-
- *------------------------------------------------------------------------------
- * Get count value, return in d6...
-
- get_cnt move.b 0(a3,d3.w),d6 * Get next control byte
- beq gcnt2 * Br. if zero
- cmp.b #1,d6
- beq gcnt2 * Br. if one
- addq #1,d3
- ext.w d6 * Return a word
- rts
-
- gcnt2 move.b 1(a3,d3.w),d0 * Get hi byte of count
- lsl #7,d0
- lsl #1,d0
- move.b 2(a3,d3.w),d0 * Get lo byte of count
- addq #3,d3
- tst.b d6
- beq gcnt_x
- neg d0 * Neg.value flags a copy operation
- gcnt_x move d0,d6
- rts
-
-
- *------------------------------------------------------------------------------
- * Update screen offset in d5...
-
- get_adr add #160,d5 * Next scrn row
- cmp #32000,d5 * Past bottom line?
- blt adr_xit * No, return.
- sub #31992,d5 * Top of next column, same plane
- cmp #160,d5 * Past end of line?
- blt adr_xit * No, return.
- sub #158,d5 * Next plane.
- adr_xit rts
-